#pragma once

#include<netinet/in.h>
#include"event_loop.h"
#include"tcp_conn.h"
#include"message.h"
#include"thread_pool.h"


class tcp_server{
public:
    // 构造函数
    tcp_server(event_loop* loop,const char* ip, uint16_t port, int maxConn=512, int thread_cnt=3);

    // 提供创建连接的服务
    void do_accept();

    // 析构函数
    ~tcp_server();

private:
    int _sockfd;                    //套接字 listen fd
    struct sockaddr_in _connaddr;   //客户端地址
    socklen_t _addrlen;             //客户端地址长度

    // event_loop epoll的多路IO复用机制
    event_loop* _loop;

public:
    //---- 客户端链接管理部分-----
    static void increase_conn(int connfd, tcp_conn *conn);    //新增一个新建的连接
    static void decrease_conn(int connfd);                    //减少一个断开的连接
    static void get_conn_num(int *curr_conn);                 //得到当前链接的刻度
    static tcp_conn **conns;                                  //全部已经在线的连接信息

private:
    
    static int _max_conns;                     //最大client链接个数
    static int _curr_conns;                    //当前链接刻度
    static pthread_mutex_t _conns_mutex;       //保护_curr_conns刻度修改的锁

public:
    // 添加一个路由分发机制句柄
    static msg_router _router;

    // 提供一个添加路由的方法
    static void add_msg_router(int msgid, msg_callback *msg_cb, void* args = NULL); 

    
    
    // ------- 创建链接/销毁链接 Hook 部分 -----
    //设置链接的创建hook函数
    static void set_conn_start(conn_callback cb, void *args = NULL);

    //设置链接的销毁hook函数
    static void set_conn_close(conn_callback cb, void *args = NULL);

    //创建链接之后要触发的 回调函数
    static conn_callback conn_start_cb;
    static void *conn_start_cb_args;

    //销毁链接之前要触发的 回调函数
    static conn_callback conn_close_cb;
    static void *conn_close_cb_args;
    
private:
    // 线程池
    thread_pool* _thread_pool;


public:
    // 添加一个一般性新任务
    void set_task(task_func func, void* args=NULL);

};


